#ifndef CACHE_H
#define CACHE_H

#include <stddef.h>
#include <pthread.h>
#include <time.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <bits/pthreadtypes.h>

/* 核心数据结构 */

// 缓存节点
typedef struct CacheNode {
    char* key;
    char* value;
    time_t expire_time;      // 过期时间戳，0表示永不过期
    time_t last_access;      // 最后访问时间，用于LRU
    int access_count;        // 访问次数，用于LFU
    struct CacheNode* next;  // 链表指针
} CacheNode;

// 缓存桶（哈希表的一个桶）
typedef struct CacheBucket {
    CacheNode* head;
    pthread_mutex_t lock;    // 桶级锁，实现细粒度并发控制
} CacheBucket;

// 单级缓存结构
typedef struct Cache {
    CacheBucket* buckets;    // 哈希桶数组
    int bucket_count;        // 桶数量
    int total_nodes;         // 总节点数
    int max_nodes;           // 最大节点数限制
    size_t max_memory;       // 最大内存限制（字节）
    size_t current_memory;   // 当前使用内存（字节）
    
    // 淘汰策略
    enum {
        EVICTION_LRU,        // 最近最少使用
        EVICTION_LFU,        // 最少使用
        EVICTION_RANDOM,     // 随机淘汰
        EVICTION_APPROX_LRU, // 近似LRU淘汰
    } eviction_policy;
    
    // 统计信息
    struct {
        long long hits;       // 命中次数
        long long misses;     // 未命中次数
        long long evictions;  // 淘汰次数
        long long expires;    // 过期次数
    } stats;
     
    pthread_rwlock_t stats_lock;  // 统计信息读写锁
    
    // 主动过期清理相关
    pthread_t cleanup_thread;
    int cleanup_running;
    pthread_mutex_t cleanup_lock;
    int cleanup_interval;  // 清理间隔（秒）
    int max_expired_per_cleanup;  // 每次清理最大过期数量
} Cache;

/* 核心接口函数 */

// 初始化缓存
Cache* cache_init(int bucket_count, int max_nodes, size_t max_memory, int eviction_policy);

// 销毁缓存
void cache_destroy(Cache* cache);

// 基本操作
int cache_set(Cache* cache, const char* key, const char* value, int ttl);
CacheNode* cache_get(Cache* cache, const char* key);
int cache_delete(Cache* cache, const char* key);

// 辅助操作
// int cache_exists(Cache* cache, const char* key);
int cache_ttl(Cache* cache, const char* key);
int cache_expire(Cache* cache, const char* key, int ttl);
// int cache_clean_expired(Cache* cache);

// 统计信息
void cache_get_stats(Cache* cache, long long* hits, long long* misses, 
                    long long* evictions, long long* expires);
void cache_print_stats(Cache* cache, const char* name);

/* 工具函数 */

// 计算哈希值
unsigned int hash_function(const char* key, int bucket_count);

// 创建/销毁节点
CacheNode* create_cache_node(const char* key, const char* value, int ttl);
void destroy_cache_node(CacheNode* node);

// 获取当前时间
time_t get_current_time(void);

/* 淘汰策略 */
// // 随机淘汰一个节点
// int cache_evict_random(Cache* cache);
// // 近似LRU淘汰（采样淘汰）
// int cache_evict_approx_lru(Cache* cache, int sample_size);
// // 标准LRU淘汰
// int cache_evict_lru(Cache* cache);
// // 通用淘汰接口（根据策略选择）
// int cache_evict(Cache* cache);

// 主动过期清理相关函数
int cache_start_cleanup_thread(Cache* cache);
void cache_stop_cleanup_thread(Cache* cache);
// 自适应清理
void* cache_cleanup_thread(void* arg);
// 清理逻辑
int cache_cleanup_expired_adaptive(Cache* cache);

#endif
